§18 Управление исполнителем Чертёжник |
Исполнитель Чертёжник предназначен для построения рисунков на координатной плоскости. При задании точек этой координатной плоскости, в отличие от того, как это принято в математике, координаты х и у разделяются запятой. Например, координаты выделенной на рис. 63 точки будут записаны так: (1, 1). Чертёжник имеет перо, которое можно поднимать, опускать и перемещать. При перемещении опущенного пера за ним остаётся след — отрезок от предыдущего положения пера до нового. При перемещении поднятого пера никакого следа на плоскости не остаётся. В начальном положении перо Чертёжника всегда поднято и находится в точке (0, 0). По команде поднять перо Чертёжник поднимает перо. Если перо уже было поднято, Чертёжник игнорирует эту команду: он не меняет положение пера и не сообщает об отказе. Иначе говоря, каким бы ни было положение пера до команды поднять перо, после этой команды оно будет поднятым. Точно так же, независимо от первоначального положения, после выполнения команды опустить перо оно оказывается опущенным, т. е. готовым к рисованию. Рисунки Чертёжник выполняет с помощью команд сместиться в точку и сдвинуться на вектор. По команде сместиться в точку (a, b) Чертёжник сдвигается в точку с координатами (а, b). На рисунке 64 показаны результаты выполнения команды сместиться в точку (2, 3) при различных положениях пера до этой команды. Видно, что, независимо от предыдущего положения, перо оказывается в точке (2, 3), но длина и направление отрезка, который при этом чертится, могут быть различны. Команду сместиться в точку называют командой абсолютного смещения. Пусть перо Чертёжника находится в точке (х, у). По команде сместиться на вектор (a, b) Чертёжник отсчитывает а единиц вправо вдоль горизонтальной оси (оси абсцисс), b единиц вверх вдоль вертикальной оси (оси ординат) и сдвигает перо в точку с координатами (х + a; у + b). Таким образом, координаты, указанные в команде, отсчитываются не от начала координат, а относительно текущего положения пера Чертежника. Поэтому команду сместиться на вектор называют командой относительного смещения. На рисунке 65 показаны результаты выполнения команды сместиться на вектор (2, 3) при различных положениях пера до этой команды. Из рисунка видно, что положение пера после этой команды зависит от его предыдущего положения, зато в результате получаются отрезки, длина и направление которых одинаковы. В математике направленные отрезки называются векторами, отсюда и происходит название команды. Чертёжник может исполнять только правильно записанные команды. Например, если вместо команды сместиться на вектор написать сдвинь на вектор, то Чертёжник эту запись не поймёт и сразу же сообщит об ошибке. Ошибки в записи команд называются синтаксическими. Алгоритм может содержать логические ошибки. Например, все команды могут быть записаны правильно, но в результате логической ошибки последовательность их выполнения не будет приводить к поставленной цели или выполнение некоторых команд приведёт к отказу. Пример алгоритма управления Чертёжником Изобразим с помощью Чертёжника треугольник, положение вершин которого на координатной плоскости определяется парами чисел (1, 1), (3, 5), (5, 2) (рис. 66). Так как в начале работы перо Чертёжника всегда поднято, то для рисования треугольника с заданными координатами достаточно выполнить следующую последовательность команд: сместиться в точку (1, 1) опустить перо сместиться в точку (3, 5) сместиться в точку (5, 2) сместиться в точку (1, 1) А теперь составим такой алгоритм управления Чертёжником, чтобы с его помощью в произвольном месте координатной плоскости можно было нарисовать прямоугольник со сторонами, параллельными координатным осям, длины которых равны 2 и 4 единицам. Зафиксируем одну из вершин прямоугольника в точке (1, 1). Нужный рисунок на координатной плоскости может выглядеть, как показано на рис. 67. Можно определить координаты каждой из вершин этого прямоугольника и для его изображения составить следующую программу: сместиться в точку (1, 1) опустить перо сместиться в точку (1, 3) сместиться в точку (5, 3) сместиться в точку (5, 1) сместиться в точку (1, 1) Этот алгоритм не будет решать поставленную задачу, если изменить координаты начальной точки (рис. 68). Изменение координат одной из вершин повлечёт за собой пересчет координат всех вершин прямоугольника. Причём это придется делать самому разработчику алгоритма. Воспользуемся для рисования прямоугольника командой относительного смещения. Пусть (х, у) — координаты вершины А прямоугольника ABCD (рис. 69). Тогда координаты вершины В можно записать как (х, у + 2), вершины С - как (х + 4, у + 2), вершины D - как (х + 4, у) (см. рис. 69). Чтобы изобразить отрезок АВ, воспользуемся командой сместиться на вектор (0, 2). В результате Чертёжник сдвинет перо из точки с координатами (х, у) в точку с координатами (x + 0, у + 2). По команде сместиться на вектор (4, 0) перо окажется в точке (х + 4, у + 2). Чтобы из этой точки перейти в точку (х + 4, у + 0), следует выполнить команду сместиться на вектор (0, -2). По команде сместиться на вектор (-4, 0) перо Чертёжника прочертит отрезок к точке А:
сместиться в точку (1, 1) опустить перо сместиться на вектор (0, 2) сместиться на вектор (4, 0) сместиться на вектор (0, -2) сместиться на вектор (-4, 0) Для того чтобы нарисовать прямоугольник в другом месте координатной плоскости, например в точке с координатами (5, 5), достаточно изменить в этой программе только первую строку: сместиться в точку (5, 5) С помощью команды абсолютного смещения рисунок «привязывается» к строго определенным точкам координатной плоскости. Она используется чаще всего для установки начального положения пера Чертёжника. Команды относительного смещения применяются для создания рисунков, у которых точное место не важно или которые нужно воспроизводить в разных местах. Чертёжник учится, или Использование вспомогательных алгоритмов Чертёжник может рисовать любые фигуры из отрезков, например цифры почтового индекса. Как известно, каждая такая цифра вписана в прямоугольник (рис. 70). Условимся при рисовании каждой цифры за начальную точку брать левую нижнюю вершину соответствующего прямоугольника. Алгоритм рисования цифры 0 может иметь вид: опустить перо сместиться на вектор (0, 2) сместиться на вектор (1, 0) сместиться на вектор (0, -2) сместиться на вектор (-1, 0) поднять перо сместиться на вектор (2, 0) Для рисования цифры 6 можно использовать алгоритм: сместиться на вектор (1, 2) опустить перо сместиться на вектор (-1, -1) сместиться на вектор (1, 0) сместиться на вектор (0, -1) сместиться на вектор (-1, 0) сместиться на вектор (0, 1) поднять перо сместиться на вектор (2, -1) А теперь представьте, что для Чертёжника необходимо разработать алгоритм рисования почтового индекса города Красноярска — 660000. Самый простой вариант — составить очень длинный алгоритм, в котором дважды повторить рисование цифры 6 и четырежды — цифры 0. Но есть и другой способ. Оказывается, Чертёжник может «запомнить», как рисуется та или иная цифра. Для этого алгоритм рисования цифр 0 и 6 нужно оформить в виде вспомогательного алгоритма. Вспомогательный алгоритм рисования цифры 0 будет выглядеть так: алг цифра_0 нач опустить перо сместиться на вектор (0, 2) сместиться на вектор (1, 0) сместиться на вектор (0, -2) сместиться на вектор (-1, 0) поднять перо сместиться на вектор (2, 0) кон Строка алг цифра_0 называется заголовком алгоритма. Имя алгоритма — цифра_0. Алгоритм рисования буквы помещается чуть правее между служебными словами нач и кон. Приказ на выполнение вспомогательного алгоритма записывается в основном алгоритме. В среде КуМир основной алгоритм для изображения индекса 660000 будет выглядеть так: использовать Чертежник алг индекс Красноярска нач цифра_6 цифра_6 цифра_0 цифра_0 цифра_0 цифра_0 кон Цикл ПОВТОРИТЬ n РАЗ При составлении алгоритмов довольно часто встречаются случаи, когда некоторую последовательность команд нужно выполнять несколько раз подряд. Для упрощения записи алгоритма в таких случаях можно использовать специальную конструкцию повторения. Например, программу рисования ряда из пяти ромбов (рис. 71) с помощью конструкции повторения можно записать так: использовать Чертежник алг ряд ромбов нач сместиться в точку (1, 2) опустить перо нц 5 раз сместиться на вектор (1, 2) сместиться на вектор (1, -2) сместиться на вектор (-1, -2) сместиться на вектор (-1, 2) поднять перо сместиться на вектор (3, 0) кц кон Рисование ромба можно оформить в виде вспомогательного алгоритма: алг ромб нач сместиться на вектор (1, 2) сместиться на вектор (1, -2) сместиться на вектор (-1, -2) сместиться на вектор (-1, 2) кон Тогда основной алгоритм будет выглядеть так: использовать Чертежник алг ряд ромбов_1 нач сместиться в точку (1, 2) нц 5 раз опустить перо ромб поднять перо сместиться на вектор (3, 0) кц кон В общем виде конструкция повторения записывается так: нц <число повторений> раз <тело цикла> кц Служебные слова нц и кц пишутся одно под другим. Чуть правее между ними записывается повторяющаяся последовательность команд (тело цикла). Число повторений — произвольное целое число. Именно столько раз при выполнении алгоритма будут повторены команды, образующие тело цикла. |